<?php


namespace app\utils;


use app\lib\exception\ServerException;
use think\facade\Cache;
use think\Response;

class SingleLogin
{
    /**
     * 单点登入，顶号操作
     * 在其他设备或其他浏览器登入同一个账号时
     * 清除之前设备或浏览器的登入状态
     * @param String $token
     * @param Int $user_id
     * @param String $role
     * @return
     * @throws \Psr\SimpleCache\InvalidArgumentException
     */
    public function holdNumber(String $token, Int $user_id, String $role){
        try {
            //获取token，并拆分三段。
            $tokenNode = explode('.', $token);
            if ($tokenNode == null&& count($tokenNode) != 3){
                throw new ServerException('JWT格式错误');
            }

            //分权限存入一个has表,has名为token头部+应用名(权限名)+account_number
            $hasName = $tokenNode[0].'.'.$role.'.account_number';

            //每次登入时查询has表指定key, key为user_id，value为token
            $oldToken = Cache::store('redis')->hget($hasName, $user_id);

            //判断是否有数据，如有数据，代表该账号登入过，且该token为最新的
            if ($oldToken != null){
                //delete凭证，清除登入状态。如已经失效delete操作也不冲突
                Cache::store('redis')->delete($oldToken);
            }

            //为了记录到token为最新的，故需要更新has表中记录凭证
            Cache::store('redis')->hset($hasName, $user_id, $token);
        }catch (\Exception $exception){
            return false;
        }
        return true;
    }
}